export default class HeartCheckUtil {
  // 1秒钟发一次心跳
  timeout = 1000
  // 如果之秒之内没有调用start，则close ws
  closeTimeout = 100000
  timeoutObj = null
  serverTimeoutObj = null
  // 是否打印日志
  isShowLog = true
  
  constructor ({timeout} = {}) {
    this.timeout = timeout || this.timeout
  }

  reset () {
    clearTimeout(this.timeoutObj)
    clearTimeout(this.serverTimeoutObj)
    return this
  }

  start (ws) {
    this.timeoutObj = setTimeout(() => {
      // 这里发送一个心跳，后端收到后，返回一个心跳消息，
      // onmessage 拿到返回的心跳就说明连接正常
      // 如果websocket正常连接，那么发送信息
      ws.readyState === 1 && ws.send('ping')
      this.isShowLog && console.log('ping!')
      // 如果超过一定时间还没重置，说明后端主动断开了
      this.serverTimeoutObj = setTimeout(() => {
        // 如果onclose会执行reconnect，我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
        ws.close()
      }, this.closeTimeout)
    }, this.timeout)
  }
}
